{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "IORSI1X8W5eM"
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "import pickle\n",
    "from tqdm import tqdm\n",
    "import copy\n",
    "import time\n",
    "\n",
    "import torch\n",
    "from torch import nn\n",
    "from torchsummary import summary\n",
    "from torch.utils.data import DataLoader\n",
    "import torch.nn.functional as F"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "uG9YZGlVXPo6"
   },
   "outputs": [],
   "source": [
    "import hc_utils as utils"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "iGYTQTPj3Qjs",
    "outputId": "a4944676-bf97-44ce-d79d-76feeed24c56"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'cpu'"
      ]
     },
     "execution_count": 109,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "device = 'cuda' if torch.cuda.is_available() else 'cpu'\n",
    "device"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "AAu3nTN_XIlN"
   },
   "outputs": [],
   "source": [
    "data32 = utils.load_data('./data/heat_cond_data_n32_new.pickle', normalize=True)\n",
    "train_loader32, test_loader32 = utils.get_data_loaders(data32, test_size=0.5, batch_size=128, training_noise=False)\n",
    "test_data = utils.load_data('./data/heat_cond_data_n64.pickle', normalize=True)\n",
    "train_loader64, test_loader64 = utils.get_data_loaders(test_data, test_size=0.2, batch_size=8, training_noise=False, normalize=False, random_state=21)\n",
    "test_loader = DataLoader(utils.HeatConductionDataset(test_data, noise=None), batch_size=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "mWYT9PqUzuO9",
    "outputId": "dc5c3d1a-21c1-4d72-95e9-379d09946ee1"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1024, 1024)"
      ]
     },
     "execution_count": 112,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(train_loader32.dataset), len(test_loader32.dataset)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "T-sFQi_iF3Id"
   },
   "outputs": [],
   "source": [
    "with open('./data/heat_cond_data_n64.pickle', mode='rb') as input_file:\n",
    "        td = pickle.load(input_file)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "IixWvE2R2dpa"
   },
   "outputs": [],
   "source": [
    "class ConvNet(nn.Module):\n",
    "    def __init__(self, in_channels=2, out_features=4, bn=False, af=nn.ReLU(), transform_output=False):\n",
    "        super().__init__()\n",
    "\n",
    "        self.conv = nn.Sequential(\n",
    "            nn.Conv2d(in_channels=in_channels, out_channels=4, kernel_size=3, padding='same', padding_mode='reflect'),\n",
    "            nn.BatchNorm2d(num_features=4),\n",
    "            af,\n",
    "            nn.Conv2d(in_channels=4, out_channels=8, kernel_size=3, padding='same', padding_mode='reflect'),\n",
    "            nn.BatchNorm2d(num_features=8),\n",
    "            af,\n",
    "            nn.MaxPool2d(kernel_size=2, stride=2),\n",
    "            nn.Conv2d(in_channels=8, out_channels=16, kernel_size=3, padding='same', padding_mode='reflect'),\n",
    "            nn.BatchNorm2d(num_features=16),\n",
    "            af,\n",
    "            nn.Conv2d(in_channels=16, out_channels=32, kernel_size=3, padding='same', padding_mode='reflect'),\n",
    "            nn.BatchNorm2d(num_features=32),\n",
    "            af,\n",
    "            nn.MaxPool2d(kernel_size=2, stride=2),\n",
    "            nn.Conv2d(in_channels=32, out_channels=64, kernel_size=3, padding='same', padding_mode='reflect'),\n",
    "            nn.BatchNorm2d(num_features=64),\n",
    "            af,\n",
    "            nn.Conv2d(in_channels=64, out_channels=128, kernel_size=3, padding='same', padding_mode='reflect'),\n",
    "            nn.BatchNorm2d(num_features=128),\n",
    "            af,\n",
    "            nn.MaxPool2d(kernel_size=2, stride=2),\n",
    "            nn.Conv2d(in_channels=128, out_channels=256, kernel_size=3, padding='same', padding_mode='reflect'),\n",
    "            nn.BatchNorm2d(num_features=256),\n",
    "            af,\n",
    "        )\n",
    "        \n",
    "        self.avgpool = nn.AdaptiveAvgPool2d(output_size=1)\n",
    "        \n",
    "        self.fc = nn.Linear(in_features=256, out_features=out_features)\n",
    "\n",
    "        self.transform_output = transform_output\n",
    "        \n",
    "    def forward(self, x):\n",
    "        y = self.conv(x)\n",
    "        y = self.avgpool(y)\n",
    "        y = torch.flatten(y, start_dim=1)\n",
    "        y = self.fc(y)\n",
    "\n",
    "        if self.transform_output:\n",
    "            y = nn.functional.sigmoid(y)\n",
    "\n",
    "        return y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "BvY2vmvwXM08"
   },
   "outputs": [],
   "source": [
    "class DownConvBlock(nn.Module):\n",
    "    def __init__(self, in_channels, factor=2, negative_slope=0.2):\n",
    "        super().__init__()\n",
    "        \n",
    "        self.conv0 = nn.Conv2d(in_channels=in_channels, out_channels=4*in_channels, kernel_size=3, padding='same', padding_mode='reflect')\n",
    "        self.bn0 = nn.BatchNorm2d(num_features = 4*in_channels)\n",
    "        \n",
    "        self.conv1 = nn.Conv2d(in_channels=4*in_channels, out_channels=8*in_channels, kernel_size=3, padding='same', padding_mode='reflect')\n",
    "        self.bn1 = nn.BatchNorm2d(num_features = 8*in_channels)\n",
    "        \n",
    "        self.conv2 = nn.Conv2d(in_channels=8*in_channels, out_channels=factor*in_channels, kernel_size=2, stride=2)\n",
    "        self.bn2 = nn.BatchNorm2d(num_features = factor*in_channels)\n",
    "        \n",
    "        self.lrelu = nn.LeakyReLU(negative_slope=0.2)\n",
    "        self.downsample = nn.AvgPool2d(kernel_size=2, stride=2)\n",
    "        self.maxpool = nn.MaxPool2d(kernel_size=2, stride=2)\n",
    "        \n",
    "    def forward(self, x):\n",
    "        y = self.lrelu(self.conv0(x))\n",
    "        y = self.lrelu(self.conv1(y))\n",
    "        y = self.lrelu(self.conv2(y))\n",
    "        \n",
    "        y = y + self.downsample(x)\n",
    "        return y        "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "3ZpgbrcsXm2k"
   },
   "outputs": [],
   "source": [
    "class HCEncoder(nn.Module):\n",
    "    def __init__(self, n_layers=5, in_channels=2, factor=2, negative_slope=0.2):\n",
    "        super().__init__()\n",
    "        \n",
    "        layers = []\n",
    "        \n",
    "        for i in range(n_layers):\n",
    "            layers.append(DownConvBlock(in_channels=in_channels*factor**i, factor=factor, negative_slope=negative_slope))\n",
    "        \n",
    "        self.blocks = nn.Sequential(*layers)\n",
    "           \n",
    "    def forward(self, x):\n",
    "        return self.blocks(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "kPbtgpNgXozv"
   },
   "outputs": [],
   "source": [
    "class UpConvBlock(nn.Module):\n",
    "    def __init__(self, in_channels, factor=2, negative_slope=0.2):\n",
    "        super().__init__()\n",
    "        \n",
    "        self.conv0 = nn.ConvTranspose2d(in_channels=in_channels, out_channels=8*in_channels, kernel_size=2, stride=2)\n",
    "        self.bn0 = nn.BatchNorm2d(num_features = 8*in_channels)\n",
    "        \n",
    "        self.conv1 = nn.Conv2d(in_channels=8*in_channels, out_channels=4*in_channels, kernel_size=3, padding='same', padding_mode='reflect')\n",
    "        self.bn1 = nn.BatchNorm2d(num_features = 4*in_channels)\n",
    "        \n",
    "        self.conv2 = nn.Conv2d(in_channels=4*in_channels, out_channels=int(in_channels/factor), kernel_size=3, padding='same', padding_mode='reflect')\n",
    "        self.bn2 = nn.BatchNorm2d(num_features = int(in_channels/factor))\n",
    "\n",
    "        self.lrelu = nn.LeakyReLU(negative_slope=0.2)\n",
    "        self.upsample = nn.Upsample(scale_factor = 2, mode='bilinear')\n",
    "        \n",
    "    def forward(self, x):\n",
    "        y = self.lrelu(self.bn0(self.conv0(x)))\n",
    "        y = self.lrelu(self.bn1(self.conv1(y)))\n",
    "        y = self.lrelu(self.bn2(self.conv2(y)))\n",
    "        #return self.upsample(x)        \n",
    "        return y  + self.upsample(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "xkB9XlCxXrRG"
   },
   "outputs": [],
   "source": [
    "class HCDecoder(nn.Module):\n",
    "    def __init__(self, n_layers=5, in_channels=32, factor=2, negative_slope=0.2):\n",
    "        super().__init__()\n",
    "        \n",
    "        layers = []\n",
    "        \n",
    "        for i in range(n_layers):\n",
    "            layers.append(UpConvBlock(in_channels=int(in_channels/factor**i), factor=factor, negative_slope=negative_slope))\n",
    "        \n",
    "        self.blocks = nn.Sequential(*layers)\n",
    "           \n",
    "    def forward(self, x):\n",
    "        return self.blocks(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "XglLydVCXwGr"
   },
   "outputs": [],
   "source": [
    "class HCAutoEncoder(nn.Module):\n",
    "    def __init__(self, regressor=None, n_layers=4, in_channels=2, factor=2, negative_slope=0.2, denoising=False):\n",
    "        super().__init__()\n",
    "        \n",
    "        self.denoising = denoising\n",
    "        \n",
    "        self.encoder = HCEncoder(n_layers=n_layers, in_channels=in_channels, factor=factor, negative_slope=negative_slope)\n",
    "        \n",
    "        self.decoder = HCDecoder(n_layers=n_layers, in_channels=int(in_channels*factor**n_layers), factor=factor, negative_slope=negative_slope)\n",
    "        \n",
    "        self.regressor = regressor\n",
    "           \n",
    "    def forward(self, x):\n",
    "        if self.denoising:\n",
    "            x += np.random.normal(0, 0.1, size=x.shape)\n",
    "            \n",
    "        latent = self.encoder(x)\n",
    "        reconst = self.decoder(latent)\n",
    "        y = self.regressor(latent) if self.regressor else None\n",
    "        return latent, reconst, y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "0Ao89I8wX8s7"
   },
   "outputs": [],
   "source": [
    "convnet = torch.load('./models/convnet32_3.model')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "F2h_vmTJYcEV",
    "outputId": "5d046994-6b59-4e3d-f631-0ea6ac1942fa"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "----------------------------------------------------------------\n",
      "        Layer (type)               Output Shape         Param #\n",
      "================================================================\n",
      "            Conv2d-1            [-1, 4, 16, 16]              76\n",
      "       BatchNorm2d-2            [-1, 4, 16, 16]               8\n",
      "              ReLU-3            [-1, 4, 16, 16]               0\n",
      "            Conv2d-4            [-1, 8, 16, 16]             296\n",
      "       BatchNorm2d-5            [-1, 8, 16, 16]              16\n",
      "              ReLU-6            [-1, 8, 16, 16]               0\n",
      "         MaxPool2d-7              [-1, 8, 8, 8]               0\n",
      "            Conv2d-8             [-1, 16, 8, 8]           1,168\n",
      "       BatchNorm2d-9             [-1, 16, 8, 8]              32\n",
      "             ReLU-10             [-1, 16, 8, 8]               0\n",
      "           Conv2d-11             [-1, 32, 8, 8]           4,640\n",
      "      BatchNorm2d-12             [-1, 32, 8, 8]              64\n",
      "             ReLU-13             [-1, 32, 8, 8]               0\n",
      "        MaxPool2d-14             [-1, 32, 4, 4]               0\n",
      "           Conv2d-15             [-1, 64, 4, 4]          18,496\n",
      "      BatchNorm2d-16             [-1, 64, 4, 4]             128\n",
      "             ReLU-17             [-1, 64, 4, 4]               0\n",
      "           Conv2d-18            [-1, 128, 4, 4]          73,856\n",
      "      BatchNorm2d-19            [-1, 128, 4, 4]             256\n",
      "             ReLU-20            [-1, 128, 4, 4]               0\n",
      "        MaxPool2d-21            [-1, 128, 2, 2]               0\n",
      "           Conv2d-22            [-1, 256, 2, 2]         295,168\n",
      "      BatchNorm2d-23            [-1, 256, 2, 2]             512\n",
      "             ReLU-24            [-1, 256, 2, 2]               0\n",
      "AdaptiveAvgPool2d-25            [-1, 256, 1, 1]               0\n",
      "           Linear-26                    [-1, 4]           1,028\n",
      "================================================================\n",
      "Total params: 395,744\n",
      "Trainable params: 395,744\n",
      "Non-trainable params: 0\n",
      "----------------------------------------------------------------\n",
      "Input size (MB): 0.00\n",
      "Forward/backward pass size (MB): 0.25\n",
      "Params size (MB): 1.51\n",
      "Estimated Total Size (MB): 1.76\n",
      "----------------------------------------------------------------\n"
     ]
    }
   ],
   "source": [
    "summary(convnet.float(), (2,16,16))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "e8fJBpy2YDoh",
    "outputId": "c7b04e2b-6eaa-4f1f-b9d7-952498cedc2f"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "----------------------------------------------------------------\n",
      "        Layer (type)               Output Shape         Param #\n",
      "================================================================\n",
      "            Conv2d-1            [-1, 8, 32, 32]             152\n",
      "         LeakyReLU-2            [-1, 8, 32, 32]               0\n",
      "            Conv2d-3           [-1, 16, 32, 32]           1,168\n",
      "         LeakyReLU-4           [-1, 16, 32, 32]               0\n",
      "            Conv2d-5            [-1, 2, 16, 16]             130\n",
      "         LeakyReLU-6            [-1, 2, 16, 16]               0\n",
      "         AvgPool2d-7            [-1, 2, 16, 16]               0\n",
      "     DownConvBlock-8            [-1, 2, 16, 16]               0\n",
      "         HCEncoder-9            [-1, 2, 16, 16]               0\n",
      "  ConvTranspose2d-10           [-1, 16, 32, 32]             144\n",
      "      BatchNorm2d-11           [-1, 16, 32, 32]              32\n",
      "        LeakyReLU-12           [-1, 16, 32, 32]               0\n",
      "           Conv2d-13            [-1, 8, 32, 32]           1,160\n",
      "      BatchNorm2d-14            [-1, 8, 32, 32]              16\n",
      "        LeakyReLU-15            [-1, 8, 32, 32]               0\n",
      "           Conv2d-16            [-1, 2, 32, 32]             146\n",
      "      BatchNorm2d-17            [-1, 2, 32, 32]               4\n",
      "        LeakyReLU-18            [-1, 2, 32, 32]               0\n",
      "         Upsample-19            [-1, 2, 32, 32]               0\n",
      "      UpConvBlock-20            [-1, 2, 32, 32]               0\n",
      "        HCDecoder-21            [-1, 2, 32, 32]               0\n",
      "           Conv2d-22            [-1, 4, 16, 16]              76\n",
      "      BatchNorm2d-23            [-1, 4, 16, 16]               8\n",
      "             ReLU-24            [-1, 4, 16, 16]               0\n",
      "           Conv2d-25            [-1, 8, 16, 16]             296\n",
      "      BatchNorm2d-26            [-1, 8, 16, 16]              16\n",
      "             ReLU-27            [-1, 8, 16, 16]               0\n",
      "        MaxPool2d-28              [-1, 8, 8, 8]               0\n",
      "           Conv2d-29             [-1, 16, 8, 8]           1,168\n",
      "      BatchNorm2d-30             [-1, 16, 8, 8]              32\n",
      "             ReLU-31             [-1, 16, 8, 8]               0\n",
      "           Conv2d-32             [-1, 32, 8, 8]           4,640\n",
      "      BatchNorm2d-33             [-1, 32, 8, 8]              64\n",
      "             ReLU-34             [-1, 32, 8, 8]               0\n",
      "        MaxPool2d-35             [-1, 32, 4, 4]               0\n",
      "           Conv2d-36             [-1, 64, 4, 4]          18,496\n",
      "      BatchNorm2d-37             [-1, 64, 4, 4]             128\n",
      "             ReLU-38             [-1, 64, 4, 4]               0\n",
      "           Conv2d-39            [-1, 128, 4, 4]          73,856\n",
      "      BatchNorm2d-40            [-1, 128, 4, 4]             256\n",
      "             ReLU-41            [-1, 128, 4, 4]               0\n",
      "        MaxPool2d-42            [-1, 128, 2, 2]               0\n",
      "           Conv2d-43            [-1, 256, 2, 2]         295,168\n",
      "      BatchNorm2d-44            [-1, 256, 2, 2]             512\n",
      "             ReLU-45            [-1, 256, 2, 2]               0\n",
      "AdaptiveAvgPool2d-46            [-1, 256, 1, 1]               0\n",
      "           Linear-47                    [-1, 4]           1,028\n",
      "          ConvNet-48                    [-1, 4]               0\n",
      "================================================================\n",
      "Total params: 398,696\n",
      "Trainable params: 398,696\n",
      "Non-trainable params: 0\n",
      "----------------------------------------------------------------\n",
      "Input size (MB): 0.01\n",
      "Forward/backward pass size (MB): 1.30\n",
      "Params size (MB): 1.52\n",
      "Estimated Total Size (MB): 2.83\n",
      "----------------------------------------------------------------\n"
     ]
    }
   ],
   "source": [
    "summary(HCAutoEncoder(convnet.float(), in_channels=2, n_layers=1, factor=1), (2,32,32))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "h0JYdazTYQR_"
   },
   "outputs": [],
   "source": [
    "class HCLoss(nn.Module):\n",
    "    def __init__(self, alpha=1):\n",
    "        super().__init__()\n",
    "        \n",
    "        self.alpha = alpha\n",
    "        self.metric = nn.MSELoss()\n",
    "        \n",
    "    def forward(self, x, x_hat, y, y_hat):\n",
    "        #return 2*self.metric(y[:,0], y_hat[:,0]) + self.metric(y[:,0:], y_hat[:,0:]) + self.alpha*self.metric(x, x_hat)\n",
    "        return self.metric(y, y_hat) + self.alpha*self.metric(x, x_hat)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "Ud1esd50d78d"
   },
   "outputs": [],
   "source": [
    "def epoch_step(model, dataloader, loss_fn, optimizer, device, train=True):\n",
    "    losses = []\n",
    "    \n",
    "    for x, y in dataloader:\n",
    "        x, y = x.to(device), y.to(device)\n",
    "\n",
    "        if train:\n",
    "            optimizer.zero_grad()\n",
    "            l, x_hat, y_hat = model(x)\n",
    "        else:\n",
    "            with torch.no_grad():\n",
    "                l, x_hat, y_hat = model(x)\n",
    "                \n",
    "        loss = loss_fn(x, x_hat, y, y_hat) if not y_hat is None else loss_fn(x, x_hat)\n",
    "\n",
    "        losses.append(loss.item())\n",
    "\n",
    "        if train:\n",
    "            loss.backward()\n",
    "            optimizer.step()\n",
    "            \n",
    "    return losses"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "fsRXgmMQj7sn"
   },
   "outputs": [],
   "source": [
    "def epoch_step_test(model, dataloader, loss_fn, optimizer, device, train=True):\n",
    "    losses = []\n",
    "    \n",
    "    for x, y in dataloader:\n",
    "        x, y = x.to(device), y.to(device)\n",
    "\n",
    "        if train:\n",
    "            optimizer.zero_grad()\n",
    "            preds = model(x)\n",
    "        else:\n",
    "            with torch.no_grad():\n",
    "                preds = model(x)\n",
    "\n",
    "        loss = loss_fn(preds, y)\n",
    "\n",
    "        losses.append(loss.item())\n",
    "\n",
    "        if train:\n",
    "            loss.backward()\n",
    "            optimizer.step()\n",
    "            \n",
    "    return losses"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "Led8gf-6d-xh"
   },
   "outputs": [],
   "source": [
    "def train_model(model, traindata, valdata, loss_fn, optimizer, device, n_epoch, testdata=None, test_regressor=None, prog_bar_desc='Epochs', early_stop=False, patience=10, warmup=10):\n",
    "    train_losses, valid_losses, test_losses = [], [], []\n",
    "    model = model.to(device)\n",
    "    patience_counter = 0\n",
    "    min_loss = 1\n",
    "    best_model = None\n",
    "\n",
    "    for i in tqdm(range(n_epoch), desc=prog_bar_desc):\n",
    "        model.train()\n",
    "        epoch_losses = epoch_step(model, traindata, loss_fn, optimizer, device, train=True)\n",
    "        train_losses.append(np.mean(epoch_losses))\n",
    "\n",
    "        model.eval()\n",
    "        epoch_losses = epoch_step(model, valdata, loss_fn, optimizer, device, train=False)\n",
    "        valid_losses.append(np.mean(epoch_losses))\n",
    "\n",
    "        if testdata and test_regressor:\n",
    "            predictor = nn.Sequential(model.encoder, test_regressor)\n",
    "            epoch_losses = epoch_step_test(predictor, testdata, nn.MSELoss(), None, device, train=False)\n",
    "            test_losses.append(np.mean(epoch_losses))\n",
    "\n",
    "        if early_stop:\n",
    "            if i > warmup and valid_losses[-1] < min_loss:\n",
    "                patience_counter = 0\n",
    "                min_loss = valid_losses[-1]\n",
    "                best_model = copy.deepcopy(model)\n",
    "            elif patience_counter > patience:\n",
    "                break\n",
    "            elif i > warmup:\n",
    "                patience_counter += 1\n",
    "\n",
    "    return train_losses, valid_losses, test_losses, best_model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "SsS_2or7se8B"
   },
   "outputs": [],
   "source": [
    "alphas = [0.01, 0.05, 0.1, 0.2, 1]\n",
    "denoisings = [False]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "GNxr2CVsspJF",
    "outputId": "5c060cef-c847-47d6-c67b-16c7cf8b38be"
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Epochs:  22%|███████████████▉                                                        | 111/500 [06:34<23:03,  3.56s/it]\n",
      "Epochs:  51%|████████████████████████████████████▊                                   | 256/500 [16:01<15:15,  3.75s/it]\n"
     ]
    }
   ],
   "source": [
    "results = []\n",
    "models = []\n",
    "n_epoch = 500\n",
    "\n",
    "for alpha in alphas:\n",
    "    for denoising in denoisings:\n",
    "        convnet = torch.load('./models/convnet32_3.model')\n",
    "        model = HCAutoEncoder(in_channels=2, n_layers=1, factor=1, denoising=denoising).double()\n",
    "        sgd0 = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9, weight_decay=1e-1)\n",
    "        criterion0 = nn.MSELoss()\n",
    "        \n",
    "\n",
    "        start_time = time.time()\n",
    "        #train_losses0, valid_losses0, model = train_model(model, train_loader64, test_loader64, criterion0, sgd0, device, 100, early_stop=True, patience=5)\n",
    "        model.regressor = copy.deepcopy(convnet)\n",
    "        for param in model.regressor.parameters():\n",
    "            param.grad = None\n",
    "            param.requires_grad = False\n",
    "        sgd = torch.optim.SGD(filter(lambda p: p.requires_grad, model.parameters()), lr=0.01, momentum=0.9, weight_decay=1e-3)\n",
    "        criterion = HCLoss(alpha=alpha)\n",
    "        train_losses1, valid_losses1, _, model = train_model(model, train_loader32, test_loader32, criterion, sgd, device, n_epoch, early_stop=True, patience=5)\n",
    "        model.requires_grad_(True)\n",
    "        # for param_group in sgd.param_groups:\n",
    "        #     param_group['lr'] = 0.001\n",
    "        sgd = torch.optim.SGD(model.parameters(), lr=0.001, momentum=0.9, weight_decay=1e-3)\n",
    "        train_losses_fn, valid_losses_fn, _, model = train_model(model, train_loader32, test_loader32, criterion, sgd, device, n_epoch, early_stop=True, patience=5)\n",
    "        end_time = time.time()\n",
    "\n",
    "        warmup = np.argmin(valid_losses1)\n",
    "        finish = np.argmin(valid_losses_fn)\n",
    "        train_losses = train_losses1[:warmup+1] + train_losses_fn[:finish+1]\n",
    "        valid_losses = valid_losses1[:warmup+1] + valid_losses_fn[:finish+1]\n",
    "\n",
    "        predictor = nn.Sequential(\n",
    "            model.encoder,\n",
    "            convnet\n",
    "        )\n",
    "        test_ev = utils.Evaluator(predictor, dataset=test_data)\n",
    "        test_loss = test_ev.calculate_loss()\n",
    "\n",
    "        results.append((alpha, denoising, train_losses, valid_losses, warmup, end_time-start_time, test_loss))\n",
    "        models.append((alpha, model))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "MwFoRCWJiRSp",
    "outputId": "52fc007a-43de-4e46-e067-7504c583ed54"
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Epochs:   9%|██████▍                                                                  | 44/500 [02:32<26:24,  3.47s/it]\n",
      "Epochs:  22%|████████████████▏                                                       | 112/500 [05:48<20:07,  3.11s/it]\n",
      "Epochs:  18%|█████████████▏                                                           | 90/500 [04:53<22:18,  3.27s/it]\n",
      "Epochs:   8%|█████▉                                                                   | 41/500 [02:13<24:53,  3.25s/it]\n",
      "Epochs:   9%|██████▋                                                                  | 46/500 [02:33<25:14,  3.34s/it]\n"
     ]
    }
   ],
   "source": [
    "results = []\n",
    "models = []\n",
    "n_epoch = 500\n",
    "\n",
    "for alpha in alphas:\n",
    "    for denoising in denoisings:\n",
    "        convnet = torch.load('./models/convnet32_3.model')\n",
    "        model = HCAutoEncoder(ConvNet(bn=True, af=nn.ReLU(), transform_output=True), in_channels=2, n_layers=1, factor=1, denoising=denoising).double()\n",
    "        sgd0 = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9, weight_decay=1e-1)\n",
    "        criterion0 = nn.MSELoss()\n",
    "        \n",
    "\n",
    "        start_time = time.time()\n",
    "        #train_losses0, valid_losses0, model = train_model(model, train_loader64, test_loader64, criterion0, sgd0, device, 100, early_stop=True, patience=5)\n",
    "       \n",
    "        sgd = torch.optim.SGD(filter(lambda p: p.requires_grad, model.parameters()), lr=0.01, momentum=0.9, weight_decay=1e-3)\n",
    "        criterion = HCLoss(alpha=alpha)\n",
    "        train_losses, valid_losses, test_losses, model = train_model(model, train_loader32, test_loader32, criterion, sgd, device, n_epoch, testdata=test_loader, test_regressor=convnet, early_stop=True, warmup=5, patience=10)\n",
    "        end_time = time.time()\n",
    "\n",
    "        results.append((alpha, denoising, train_losses, valid_losses, test_losses, end_time-start_time))\n",
    "        models.append((alpha, model))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "v4Y1DZw6qvfH",
    "outputId": "7c0111b7-d1ee-47a6-855e-2e7b3a4bf48f"
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Epochs:  20%|██████████████▍                                                         | 100/500 [06:47<27:11,  4.08s/it]\n",
      "Epochs:  21%|███████████████▍                                                        | 107/500 [07:08<26:13,  4.00s/it]\n",
      "Epochs:  21%|██████████████▉                                                         | 104/500 [07:00<26:43,  4.05s/it]\n",
      "Epochs:  17%|████████████▌                                                            | 86/500 [05:55<28:33,  4.14s/it]\n",
      "Epochs:  23%|████████████████▍                                                       | 114/500 [07:58<27:01,  4.20s/it]\n"
     ]
    }
   ],
   "source": [
    "results0 = []\n",
    "models0 = []\n",
    "n_epoch = 500\n",
    "\n",
    "for alpha in alphas:\n",
    "    for denoising in denoisings:\n",
    "        convnet = torch.load('./models/convnet32_3.model')\n",
    "        model = HCAutoEncoder(ConvNet(bn=True, af=nn.ReLU(), transform_output=True), in_channels=2, n_layers=1, factor=1, denoising=denoising).double()\n",
    "        sgd0 = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9, weight_decay=1e-1)\n",
    "        criterion0 = nn.MSELoss()\n",
    "        \n",
    "\n",
    "        start_time = time.time()\n",
    "        #train_losses0, valid_losses0, _,  model = train_model(model, train_loader64, test_loader64, criterion0, sgd0, device, 100, early_stop=True, patience=5)\n",
    "       \n",
    "        sgd = torch.optim.SGD(filter(lambda p: p.requires_grad, model.parameters()), lr=0.01, momentum=0.9, weight_decay=1e-3)\n",
    "        criterion = HCLoss(alpha=alpha)\n",
    "        train_losses, valid_losses, test_losses, model = train_model(model, train_loader32, test_loader32, criterion, sgd, device, n_epoch, testdata=test_loader, test_regressor=convnet, early_stop=True, warmup=5, patience=10)\n",
    "        end_time = time.time()\n",
    "\n",
    "        results0.append((alpha, denoising, train_losses, valid_losses, test_losses, end_time-start_time))\n",
    "        models0.append((alpha, model))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "CaJycye8zZVX",
    "outputId": "7556139a-f132-496a-8ccb-b4f4b7bc3a51"
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Epochs:  32%|███████████████████████▎                                                 | 32/100 [00:20<00:43,  1.56it/s]\n",
      "Epochs:  13%|█████████▏                                                               | 63/500 [04:21<30:14,  4.15s/it]\n",
      "Epochs:  35%|█████████████████████████▌                                               | 35/100 [00:21<00:39,  1.64it/s]\n",
      "Epochs:  12%|████████▉                                                                | 61/500 [04:12<30:17,  4.14s/it]\n",
      "Epochs:  36%|██████████████████████████▎                                              | 36/100 [00:21<00:38,  1.65it/s]\n",
      "Epochs:  19%|██████████████                                                           | 96/500 [06:45<28:24,  4.22s/it]\n",
      "Epochs:  34%|████████████████████████▊                                                | 34/100 [00:19<00:38,  1.71it/s]\n",
      "Epochs:  17%|████████████▎                                                            | 84/500 [05:36<27:47,  4.01s/it]\n",
      "Epochs:  27%|███████████████████▋                                                     | 27/100 [00:15<00:41,  1.77it/s]\n",
      "Epochs:  10%|███████▍                                                                 | 51/500 [03:38<32:00,  4.28s/it]\n"
     ]
    }
   ],
   "source": [
    "results2 = []\n",
    "models2 = []\n",
    "n_epoch = 500\n",
    "\n",
    "for alpha in alphas:\n",
    "    for denoising in denoisings:\n",
    "        convnet = torch.load('./models/convnet32_3.model')\n",
    "        model = HCAutoEncoder(in_channels=2, n_layers=1, factor=1, denoising=denoising).double()\n",
    "        sgd0 = torch.optim.SGD(model.parameters(), lr=0.01, momentum=0.9, weight_decay=1e-1)\n",
    "        criterion0 = nn.MSELoss()\n",
    "        \n",
    "\n",
    "        start_time = time.time()\n",
    "        train_losses0, valid_losses0, _,  model = train_model(model, train_loader64, test_loader64, criterion0, sgd0, device, 100, early_stop=True, patience=5)\n",
    "        model.regressor=ConvNet(bn=True, af=nn.ReLU(), transform_output=True).double()\n",
    "        sgd = torch.optim.SGD(filter(lambda p: p.requires_grad, model.parameters()), lr=0.01, momentum=0.9, weight_decay=1e-3)\n",
    "        criterion = HCLoss(alpha=alpha)\n",
    "        train_losses, valid_losses, test_losses, model = train_model(model, train_loader32, test_loader32, criterion, sgd, device, n_epoch, testdata=test_loader, test_regressor=convnet, early_stop=True, warmup=5, patience=10)\n",
    "        end_time = time.time()\n",
    "\n",
    "        results2.append((alpha, denoising, train_losses, valid_losses, test_losses, end_time-start_time))\n",
    "        models2.append((alpha, model))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 206
    },
    "id": "F3akDk_Yua-I",
    "outputId": "b9681851-ff7e-47d8-eddc-596106f485af"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>alpha</th>\n",
       "      <th>denoising</th>\n",
       "      <th>train_losses</th>\n",
       "      <th>valid_losses</th>\n",
       "      <th>test_losses</th>\n",
       "      <th>exec_time</th>\n",
       "      <th>epochs</th>\n",
       "      <th>min_loss</th>\n",
       "      <th>unit_time</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.01</td>\n",
       "      <td>False</td>\n",
       "      <td>[0.17641831479661665, 0.1204215723484082, 0.08...</td>\n",
       "      <td>[0.21221859356178624, 0.20439636111556653, 0.2...</td>\n",
       "      <td>[0.00809908162831846, 0.008238143543636056, 0....</td>\n",
       "      <td>152.854381</td>\n",
       "      <td>45</td>\n",
       "      <td>0.011900</td>\n",
       "      <td>3.396764</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.05</td>\n",
       "      <td>False</td>\n",
       "      <td>[0.20064236471367247, 0.14160729439986658, 0.0...</td>\n",
       "      <td>[0.21522809473595228, 0.19484879073422307, 0.1...</td>\n",
       "      <td>[0.01682969261586348, 0.01754157128343098, 0.0...</td>\n",
       "      <td>348.598795</td>\n",
       "      <td>113</td>\n",
       "      <td>0.004766</td>\n",
       "      <td>3.084945</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.10</td>\n",
       "      <td>False</td>\n",
       "      <td>[0.18782014311007567, 0.1421595656495553, 0.11...</td>\n",
       "      <td>[0.21140419140038796, 0.19192056722417233, 0.1...</td>\n",
       "      <td>[0.06529276732261056, 0.059487959134779854, 0....</td>\n",
       "      <td>293.896492</td>\n",
       "      <td>91</td>\n",
       "      <td>0.002103</td>\n",
       "      <td>3.229632</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.20</td>\n",
       "      <td>False</td>\n",
       "      <td>[0.1787486014322664, 0.11428345792265641, 0.07...</td>\n",
       "      <td>[0.2262619692338966, 0.2619569302483643, 0.359...</td>\n",
       "      <td>[0.002440473012506479, 0.0026970562915367927, ...</td>\n",
       "      <td>133.433994</td>\n",
       "      <td>42</td>\n",
       "      <td>0.012810</td>\n",
       "      <td>3.177000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1.00</td>\n",
       "      <td>False</td>\n",
       "      <td>[0.186942330301406, 0.11629229865733672, 0.070...</td>\n",
       "      <td>[0.22381575055711464, 0.22727828462317184, 0.3...</td>\n",
       "      <td>[0.05775073709323357, 0.03615628012073534, 0.0...</td>\n",
       "      <td>153.503589</td>\n",
       "      <td>47</td>\n",
       "      <td>0.024068</td>\n",
       "      <td>3.266034</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   alpha  denoising                                       train_losses  \\\n",
       "0   0.01      False  [0.17641831479661665, 0.1204215723484082, 0.08...   \n",
       "1   0.05      False  [0.20064236471367247, 0.14160729439986658, 0.0...   \n",
       "2   0.10      False  [0.18782014311007567, 0.1421595656495553, 0.11...   \n",
       "3   0.20      False  [0.1787486014322664, 0.11428345792265641, 0.07...   \n",
       "4   1.00      False  [0.186942330301406, 0.11629229865733672, 0.070...   \n",
       "\n",
       "                                        valid_losses  \\\n",
       "0  [0.21221859356178624, 0.20439636111556653, 0.2...   \n",
       "1  [0.21522809473595228, 0.19484879073422307, 0.1...   \n",
       "2  [0.21140419140038796, 0.19192056722417233, 0.1...   \n",
       "3  [0.2262619692338966, 0.2619569302483643, 0.359...   \n",
       "4  [0.22381575055711464, 0.22727828462317184, 0.3...   \n",
       "\n",
       "                                         test_losses   exec_time  epochs  \\\n",
       "0  [0.00809908162831846, 0.008238143543636056, 0....  152.854381      45   \n",
       "1  [0.01682969261586348, 0.01754157128343098, 0.0...  348.598795     113   \n",
       "2  [0.06529276732261056, 0.059487959134779854, 0....  293.896492      91   \n",
       "3  [0.002440473012506479, 0.0026970562915367927, ...  133.433994      42   \n",
       "4  [0.05775073709323357, 0.03615628012073534, 0.0...  153.503589      47   \n",
       "\n",
       "   min_loss  unit_time  \n",
       "0  0.011900   3.396764  \n",
       "1  0.004766   3.084945  \n",
       "2  0.002103   3.229632  \n",
       "3  0.012810   3.177000  \n",
       "4  0.024068   3.266034  "
      ]
     },
     "execution_count": 309,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.DataFrame(results, columns=['alpha', 'denoising', 'train_losses', 'valid_losses', 'test_losses', 'exec_time'])\n",
    "df['epochs'] = df.valid_losses.apply(lambda x: len(x))\n",
    "df['min_loss'] = df.test_losses.apply(lambda x: np.min(x[10:]))\n",
    "df['unit_time'] = df.exec_time / df.epochs\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 206
    },
    "id": "RIbOpgScro4x",
    "outputId": "732f8dfe-7b9b-4c5a-83a5-944ead9e67db"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>alpha</th>\n",
       "      <th>denoising</th>\n",
       "      <th>train_losses</th>\n",
       "      <th>valid_losses</th>\n",
       "      <th>test_losses</th>\n",
       "      <th>exec_time</th>\n",
       "      <th>epochs</th>\n",
       "      <th>min_loss</th>\n",
       "      <th>unit_time</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.01</td>\n",
       "      <td>False</td>\n",
       "      <td>[0.17883743097611288, 0.13663928231370548, 0.1...</td>\n",
       "      <td>[0.2153157511940478, 0.20409017523986905, 0.17...</td>\n",
       "      <td>[0.016954781221617757, 0.01706207444298503, 0....</td>\n",
       "      <td>407.786453</td>\n",
       "      <td>101</td>\n",
       "      <td>0.012321</td>\n",
       "      <td>4.037490</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.05</td>\n",
       "      <td>False</td>\n",
       "      <td>[0.21439013220775924, 0.14436250730076003, 0.0...</td>\n",
       "      <td>[0.21204499534393123, 0.1979969874173132, 0.25...</td>\n",
       "      <td>[0.006668142717244087, 0.005400748485847696, 0...</td>\n",
       "      <td>428.421439</td>\n",
       "      <td>108</td>\n",
       "      <td>0.038132</td>\n",
       "      <td>3.966865</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.10</td>\n",
       "      <td>False</td>\n",
       "      <td>[0.23965666930884075, 0.17157490011724771, 0.1...</td>\n",
       "      <td>[0.2150743010277658, 0.20231134539521217, 0.22...</td>\n",
       "      <td>[0.042518066487519886, 0.04140985305322667, 0....</td>\n",
       "      <td>420.998527</td>\n",
       "      <td>105</td>\n",
       "      <td>0.029369</td>\n",
       "      <td>4.009510</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.20</td>\n",
       "      <td>False</td>\n",
       "      <td>[0.27474383070032843, 0.1267989966583152, 0.07...</td>\n",
       "      <td>[0.2188328210736959, 0.23634649843792674, 0.31...</td>\n",
       "      <td>[0.0041749312622648095, 0.017829112496371532, ...</td>\n",
       "      <td>355.860409</td>\n",
       "      <td>87</td>\n",
       "      <td>0.034057</td>\n",
       "      <td>4.090350</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1.00</td>\n",
       "      <td>False</td>\n",
       "      <td>[0.4201436432444459, 0.17131252128507377, 0.11...</td>\n",
       "      <td>[0.22029482389936164, 0.20439553530889548, 0.1...</td>\n",
       "      <td>[0.03922610621842404, 0.031596493897282626, 0....</td>\n",
       "      <td>478.923318</td>\n",
       "      <td>115</td>\n",
       "      <td>0.020681</td>\n",
       "      <td>4.164551</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   alpha  denoising                                       train_losses  \\\n",
       "0   0.01      False  [0.17883743097611288, 0.13663928231370548, 0.1...   \n",
       "1   0.05      False  [0.21439013220775924, 0.14436250730076003, 0.0...   \n",
       "2   0.10      False  [0.23965666930884075, 0.17157490011724771, 0.1...   \n",
       "3   0.20      False  [0.27474383070032843, 0.1267989966583152, 0.07...   \n",
       "4   1.00      False  [0.4201436432444459, 0.17131252128507377, 0.11...   \n",
       "\n",
       "                                        valid_losses  \\\n",
       "0  [0.2153157511940478, 0.20409017523986905, 0.17...   \n",
       "1  [0.21204499534393123, 0.1979969874173132, 0.25...   \n",
       "2  [0.2150743010277658, 0.20231134539521217, 0.22...   \n",
       "3  [0.2188328210736959, 0.23634649843792674, 0.31...   \n",
       "4  [0.22029482389936164, 0.20439553530889548, 0.1...   \n",
       "\n",
       "                                         test_losses   exec_time  epochs  \\\n",
       "0  [0.016954781221617757, 0.01706207444298503, 0....  407.786453     101   \n",
       "1  [0.006668142717244087, 0.005400748485847696, 0...  428.421439     108   \n",
       "2  [0.042518066487519886, 0.04140985305322667, 0....  420.998527     105   \n",
       "3  [0.0041749312622648095, 0.017829112496371532, ...  355.860409      87   \n",
       "4  [0.03922610621842404, 0.031596493897282626, 0....  478.923318     115   \n",
       "\n",
       "   min_loss  unit_time  \n",
       "0  0.012321   4.037490  \n",
       "1  0.038132   3.966865  \n",
       "2  0.029369   4.009510  \n",
       "3  0.034057   4.090350  \n",
       "4  0.020681   4.164551  "
      ]
     },
     "execution_count": 310,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df0 = pd.DataFrame(results0, columns=['alpha', 'denoising', 'train_losses', 'valid_losses', 'test_losses', 'exec_time'])\n",
    "df0['epochs'] = df0.valid_losses.apply(lambda x: len(x))\n",
    "df0['min_loss'] = df0.test_losses.apply(lambda x: np.min(x[10:]))\n",
    "df0['unit_time'] = df0.exec_time / df0.epochs\n",
    "df0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 206
    },
    "id": "NMoi3CR65yIm",
    "outputId": "50de7950-8a49-49c8-ad97-9bd521168237"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>alpha</th>\n",
       "      <th>denoising</th>\n",
       "      <th>train_losses</th>\n",
       "      <th>valid_losses</th>\n",
       "      <th>test_losses</th>\n",
       "      <th>exec_time</th>\n",
       "      <th>epochs</th>\n",
       "      <th>min_loss</th>\n",
       "      <th>unit_time</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.01</td>\n",
       "      <td>False</td>\n",
       "      <td>[0.173943928952089, 0.11692884340864163, 0.077...</td>\n",
       "      <td>[0.21040271373347424, 0.21620595267113918, 0.2...</td>\n",
       "      <td>[0.018050740594853783, 0.01805050244017749, 0....</td>\n",
       "      <td>282.171350</td>\n",
       "      <td>64</td>\n",
       "      <td>0.018075</td>\n",
       "      <td>4.408927</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.05</td>\n",
       "      <td>False</td>\n",
       "      <td>[0.16660506942784914, 0.1020302824353106, 0.07...</td>\n",
       "      <td>[0.2173453383506822, 0.23335523527887608, 0.26...</td>\n",
       "      <td>[0.019781119110100383, 0.01977743409747047, 0....</td>\n",
       "      <td>273.898427</td>\n",
       "      <td>62</td>\n",
       "      <td>0.019772</td>\n",
       "      <td>4.417717</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.10</td>\n",
       "      <td>False</td>\n",
       "      <td>[0.19620390052858339, 0.13768150215378294, 0.0...</td>\n",
       "      <td>[0.22201389305975539, 0.20771127165525194, 0.1...</td>\n",
       "      <td>[0.019901184759765073, 0.01990536731084182, 0....</td>\n",
       "      <td>426.909626</td>\n",
       "      <td>97</td>\n",
       "      <td>0.019976</td>\n",
       "      <td>4.401130</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.20</td>\n",
       "      <td>False</td>\n",
       "      <td>[0.17262573264924688, 0.11564079495980704, 0.0...</td>\n",
       "      <td>[0.22040948417977452, 0.21119109099507888, 0.2...</td>\n",
       "      <td>[0.018448611511359028, 0.0184232709310751, 0.0...</td>\n",
       "      <td>356.494488</td>\n",
       "      <td>85</td>\n",
       "      <td>0.018496</td>\n",
       "      <td>4.194053</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1.00</td>\n",
       "      <td>False</td>\n",
       "      <td>[0.17802912295141698, 0.12887107291234956, 0.0...</td>\n",
       "      <td>[0.22221824932468665, 0.22270271723855334, 0.1...</td>\n",
       "      <td>[0.017903659113515633, 0.01770939281151737, 0....</td>\n",
       "      <td>233.423172</td>\n",
       "      <td>52</td>\n",
       "      <td>0.017754</td>\n",
       "      <td>4.488907</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   alpha  denoising                                       train_losses  \\\n",
       "0   0.01      False  [0.173943928952089, 0.11692884340864163, 0.077...   \n",
       "1   0.05      False  [0.16660506942784914, 0.1020302824353106, 0.07...   \n",
       "2   0.10      False  [0.19620390052858339, 0.13768150215378294, 0.0...   \n",
       "3   0.20      False  [0.17262573264924688, 0.11564079495980704, 0.0...   \n",
       "4   1.00      False  [0.17802912295141698, 0.12887107291234956, 0.0...   \n",
       "\n",
       "                                        valid_losses  \\\n",
       "0  [0.21040271373347424, 0.21620595267113918, 0.2...   \n",
       "1  [0.2173453383506822, 0.23335523527887608, 0.26...   \n",
       "2  [0.22201389305975539, 0.20771127165525194, 0.1...   \n",
       "3  [0.22040948417977452, 0.21119109099507888, 0.2...   \n",
       "4  [0.22221824932468665, 0.22270271723855334, 0.1...   \n",
       "\n",
       "                                         test_losses   exec_time  epochs  \\\n",
       "0  [0.018050740594853783, 0.01805050244017749, 0....  282.171350      64   \n",
       "1  [0.019781119110100383, 0.01977743409747047, 0....  273.898427      62   \n",
       "2  [0.019901184759765073, 0.01990536731084182, 0....  426.909626      97   \n",
       "3  [0.018448611511359028, 0.0184232709310751, 0.0...  356.494488      85   \n",
       "4  [0.017903659113515633, 0.01770939281151737, 0....  233.423172      52   \n",
       "\n",
       "   min_loss  unit_time  \n",
       "0  0.018075   4.408927  \n",
       "1  0.019772   4.417717  \n",
       "2  0.019976   4.401130  \n",
       "3  0.018496   4.194053  \n",
       "4  0.017754   4.488907  "
      ]
     },
     "execution_count": 311,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df2 = pd.DataFrame(results2, columns=['alpha', 'denoising', 'train_losses', 'valid_losses', 'test_losses', 'exec_time'])\n",
    "df2['epochs'] = df2.valid_losses.apply(lambda x: len(x))\n",
    "df2['min_loss'] = df2.test_losses.apply(lambda x: np.min(x[10:]))\n",
    "df2['unit_time'] = df2.exec_time / df2.epochs\n",
    "df2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "3reCx-jEAa8E"
   },
   "outputs": [],
   "source": [
    "def create_table(df_in):\n",
    "    indf = df_in.copy()\n",
    "    indf = indf.sort_values(by='min_loss')\n",
    "    indf = indf[['alpha', 'epochs', 'unit_time', 'min_loss']]\n",
    "    indf['unit_time'] = np.round(indf['unit_time'], 3)\n",
    "    indf['min_loss'] = np.round(indf['min_loss'], 4)\n",
    "    return indf"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 206
    },
    "id": "moxELiLfA3Vm",
    "outputId": "9555ac16-ad49-4431-923b-7411257d929d"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>alpha</th>\n",
       "      <th>epochs</th>\n",
       "      <th>unit_time</th>\n",
       "      <th>min_loss</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.10</td>\n",
       "      <td>91</td>\n",
       "      <td>3.230</td>\n",
       "      <td>0.0021</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.05</td>\n",
       "      <td>113</td>\n",
       "      <td>3.085</td>\n",
       "      <td>0.0048</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.01</td>\n",
       "      <td>45</td>\n",
       "      <td>3.397</td>\n",
       "      <td>0.0119</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.20</td>\n",
       "      <td>42</td>\n",
       "      <td>3.177</td>\n",
       "      <td>0.0128</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1.00</td>\n",
       "      <td>47</td>\n",
       "      <td>3.266</td>\n",
       "      <td>0.0241</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   alpha  epochs  unit_time  min_loss\n",
       "2   0.10      91      3.230    0.0021\n",
       "1   0.05     113      3.085    0.0048\n",
       "0   0.01      45      3.397    0.0119\n",
       "3   0.20      42      3.177    0.0128\n",
       "4   1.00      47      3.266    0.0241"
      ]
     },
     "execution_count": 331,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "create_table(df)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 206
    },
    "id": "u4rjasrHCWf9",
    "outputId": "84f87a07-6cf5-4622-d452-a68da72b452e"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>alpha</th>\n",
       "      <th>epochs</th>\n",
       "      <th>unit_time</th>\n",
       "      <th>min_loss</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.01</td>\n",
       "      <td>101</td>\n",
       "      <td>4.037</td>\n",
       "      <td>0.0123</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1.00</td>\n",
       "      <td>115</td>\n",
       "      <td>4.165</td>\n",
       "      <td>0.0207</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.10</td>\n",
       "      <td>105</td>\n",
       "      <td>4.010</td>\n",
       "      <td>0.0294</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.20</td>\n",
       "      <td>87</td>\n",
       "      <td>4.090</td>\n",
       "      <td>0.0341</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.05</td>\n",
       "      <td>108</td>\n",
       "      <td>3.967</td>\n",
       "      <td>0.0381</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   alpha  epochs  unit_time  min_loss\n",
       "0   0.01     101      4.037    0.0123\n",
       "4   1.00     115      4.165    0.0207\n",
       "2   0.10     105      4.010    0.0294\n",
       "3   0.20      87      4.090    0.0341\n",
       "1   0.05     108      3.967    0.0381"
      ]
     },
     "execution_count": 332,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "create_table(df0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 458
    },
    "id": "5nNOvELT4lFU",
    "outputId": "d21578f1-f6c4-411f-c24e-0c917bfb34ef"
   },
   "outputs": [
    {
     "data": {
      "image/png": "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JzF79mxOPvlk1q5dC8BLL73Ehz70IcALz+uuu4558+YxceJEbr/99tbXy87Obj1/3rx5XHbZZUybNo2Pf/zjxHchevrpp5k2bRrHHnssX/ziF1tft6+oBigi0o++99RKVu2oTuprzhiVy80fPvKQrystLWXRokUEg0Gqq6tZuHAhoVCI559/nm9961s89thj+12zZs0aXnzxRWpqajjiiCO48cYb95uL9+abb7Jy5UpGjRrFKaecwquvvsrcuXO5/vrreeWVV5gwYQLz58/v9s/bXQpAEREB4PLLLycYDAKwb98+rrnmGtatW4eZ0dLS0uk1H/zgB0lPTyc9PZ1hw4axe/duRo8e3e6c448/vvXYrFmz2Lx5M9nZ2UycOLF13t78+fO56667evGn258CUESkH3WnptZbsrKyWu//13/9F2eccQaPP/44mzdvZt68eZ1ek56e3no/GAwSiUS6dU5/UB9gFzW2RGlojvZ3MURE+sS+ffsoKSkB4L777kv66x9xxBFs3LiRzZs3A/DHP/4x6e/xfhSAXfT1R9/msw8u6+9iiIj0ia9//et885vfZPbs2b1SY8vMzOSOO+7g/PPP59hjjyUnJ4e8vLykv8/BWHw0TqqbO3eu680Ncc/+n5dpbInyr/84s9feQ0QGh9WrVzN9+vT+Lka/q62tJTs7G+ccn/vc55gyZQo33XRTt1+vs8/VzJY55zqdt6EaYBc459i+t4GymiYOlz8YRET6229+8xtmzZrFkUceyb59+7j++uv79P01CKYLqupbaGjx+v9qmyLkZHR9uw0REencTTfd1KMaX0+pBtgF26saWu+X1TT1Y0lERCRZFIBdULq3LQDLaw++Tp6IiKQGBWAXqAYoInL4UQAm2F3dyJLNlfsd31HVQHyrqfJaBaCIyOFAAZjgzpc3cPXdi4nF2o/03L63gQlFWQRMNUAROTycccYZPPvss+2O/exnP+PGG2/s9Px58+YRn2p24YUXUlVVtd853/3ud7ntttsO+r5PPPEEq1atan38ne98h+eff/4QS58cCsAEU4bl0NASbdfkCV4T6JiCIRRmp6sGKCKHhfnz5/Pwww+3O/bwww93aVHqp59+mvz8/G69b8cAvOWWWzj77LO79Vo9pQBMMHW4t33Huj017Y5vr2qgpCCT4ux01QBF5LBw2WWX8be//a11A9zN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",
      "text/plain": [
       "<Figure size 504x504 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "idx = 2\n",
    "utils.plot_loss(df0.iloc[idx].valid_losses, df0.iloc[idx].test_losses, start=0, end=None)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 458
    },
    "id": "UVmL9yJkFVQl",
    "outputId": "caabe6fd-c84b-4737-ed30-1432f783a7c3"
   },
   "outputs": [
    {
     "data": {
      "image/png": "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OHAgS5Ysicn1FM5EREREuuEPf/gDn376KX/4wx9icj0tpSEiIiLSDU899VSzf7tLlTMRERGRBKJwJiIiIgAcfvjhvPnmm82O3XHHHfzoRz9q8z5paWmRzw888MCo59x000389a9/bfexy8rKuOeee3Z5ra5o2sZYuu+++7jiiitifl2Fsw6y1lKwcTWFBZt6uikiIiJxce655/L00083O/b0009z7rnnduj+n376aZcfu2U46861dpclS5YwderUmF9X4awTrjl3Fq888feeboaIiEhcnHnmmbz66qvU19cDsGHDBrZu3cohhxzCqaeeyr777svkyZO5//77o96/aYXq97//PePHj+fggw9m1apVkeNtXee6665j7dq1TJ8+nWuuuabZtW677TamTJnClClTuOOOOyJtmzhxIpdccgmTJ0/mmGOOoba2dpffY7RrVVdXc+KJJzJt2jSmTJnCM888E/VYS4sXL45LOMNa2yc+9t13XxtvPztrhv3j/82J++OIiMieZ/ny5T3dBGuttSeeeKJ98cUXrbXW/vGPf7RXX321tdba4uJia621NTU1dvLkybaoqMhaa21qamrkvuHPFyxYYKdMmWKrq6tteXm5HTNmjL311lvbvc769evt5MmT27xWVVWVraystJMmTbILFy6069evt06n03711VfWWmvPOuss+/jjj0f9nnZ1rWeffdZefPHFkfPLysqiHmspOzs76vGWov3fAgtsG5lGszU7YcCQURRsWtPTzRARkT7u4VuvZsOqr2N6zZETpnHRNX/b5Xnhrs05c+bw9NNP8+CDDwJw55138sILLwCQn5/P6tWr6devX9RrfPzxx5x22mmkpKQAcMopp0Ru68x1AD755BNOO+00UlNTATj99NP5+OOPOeWUUxg1ahTTp08HYN9992XDhg3tfm9tXeu4447j6quv5tprr+Wkk07ikEMOYerUqa2ONZWfn096ejqZmZntPmZXqFuzEwYMHcP2LesJBAI93RQREZG4mDNnDu+++y4LFy6kpqaGfffdlw8++IB33nmHefPm8fXXXzNjxoxOb+YNxOw6YUlJSZHPnU4njY2NXbrO+PHjWbhwIVOnTuWGG27g5ptvjnqsqXiNNwOtc9YpA4eNpqHOR2lRAf36D+np5oiISB/VkQpXvKSlpXH44Yfz/e9/PzIRoLy8nOzsbFJSUli5ciWfffZZu9c49NBDufDCC7n++utpbGzk5Zdf5oc//GG710lPT6eysrLVtQ455BAuvPBCrrvuOqy1vPDCCzz++ONd+t7autbWrVvJycnhvPPOIysriwceeCDqsabiNt4MhbNOGTB0NADb89cpnImISJ917rnnctppp0Vmbh533HH885//ZOLEiUyYMIHZs2e3e/999tmHb3/720ybNo3+/fuz33777fI6/fr146CDDmLKlCkcf/zxza514YUXMmvWLAAuvvhiZsyYscsuzLbaFe1ab775Jtdccw0OhwO32829997LkiVLWh1rasmSJbzxxhuRhWcHDRrEvHnzOt2maExwTFrvN3PmTLtgwYK4PkbBpjX835xJXH7Tvzh8zgVxfSwREdmzrFixgokTJ/Z0MyQOov3fGmO+tNbOjHa+xpx1Qt6gETicTrZtXtvTTREREZE+SuGsE1xuN7kDh7N98/qeboqIiIj0UQpnnTRgyCi2b17X080QERGRPkrhrJMGDButcCYiIiJxo3DWSQOHjqayrJjqyvKeboqIiIj0QQpnnRRZTkPVMxEREYkDhbNOGjAsHM40Y1NERERiT+GskwYMCYczzdgUERGR2FM466SUtAzSs3LZpm5NERERiQOFsy4YqBmbIiLSxxQXFzN9+nSmT5/OwIEDGTJkSOTr+vr6Dl+nrKyMe+65p83b09LSYtHcqO677z6uuOKKuF1/d1E464IBQ0ezPV/hTERE+o5+/fqxaNEiFi1axGWXXcZPf/rTyNcej6fD19lVOIunJUuWxG0z8t1J4awLBgwdTdH2fBoaOv5OQkREpDd74oknmDVrFtOnT+eHP/whfr+f6upqTjzxRKZNm8aUKVN45plnuO6661i7di3Tp0/nmmuuafeat912G1OmTGHKlCnccccdAFGvGe1YNIsXL+4T4czV0w3ojQYOHY0NBCjaupFBI8b1dHNERKSPue1/H/BNUWFMrzk+N4+fHXRYl+67YsUKnnnmGf73v//hdru5/PLL+fe//01qaiqDBw/m1VdfBaC8vJz999+fpUuXsmjRonav+eWXX/Lwww/z+eefY61l//3351vf+hbr1q1rdc033nij1bFoli5dypQpU7r0PSYSVc66YMCwMQCaFCAiInuEd999ly+//JL99tuP6dOn8+6777Ju3TqmTp3K22+/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",
      "text/plain": [
       "<Figure size 720x504 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "valid_lossesplot = df.iloc[1]['valid_losses']\n",
    "test_lossesplot = df.iloc[1]['test_losses']\n",
    "\n",
    "start = 0\n",
    "\n",
    "_, ax = plt.subplots(1,1,figsize=(10,7))\n",
    "\n",
    "x = np.arange(len(valid_lossesplot[start:]))+1\n",
    "\n",
    "ax.set_title('Loss over epochs')\n",
    "ax.set_xlabel('Epoch')\n",
    "ax.set_ylabel('Loss')\n",
    "\n",
    "colors = plt.cm.BrBG(np.linspace(0, 0.8, 2))\n",
    "\n",
    "ax.plot(x, valid_lossesplot[start:], label=r'Validation loss $\\hat{L}$', color=colors[0])\n",
    "ax.plot(x, test_lossesplot[start:], label=r'Test loss $L$', color=colors[1])\n",
    "\n",
    "ax.legend()\n",
    "plt.savefig('ae_loss')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "U1Ye7nZn48SV"
   },
   "outputs": [],
   "source": [
    "loader_iter = iter(test_loader32)\n",
    "model = models[1][1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 644
    },
    "id": "NsMJsZ7N4-8P",
    "outputId": "12a31549-d858-4a39-b714-c6e31077470c"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "label tensor([0.2344, 0.2344, 0.4219, 0.1562], dtype=torch.float64)\n",
      "prediction tensor([0.2298, 0.2314, 0.4140, 0.1503], dtype=torch.float64)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<matplotlib.patches.Circle at 0x22c92049910>"
      ]
     },
     "execution_count": 347,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 720x720 with 4 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "x,y = next(loader_iter)\n",
    "with torch.no_grad():\n",
    "    l, x_hat, y_hat = model(x)\n",
    "    \n",
    "print('label', y[0])\n",
    "print('prediction', y_hat[0])\n",
    "    \n",
    "_, axs = plt.subplots(2,2, figsize=(10,10))\n",
    "axs[0,0].imshow(x[0][0], cmap='coolwarm')\n",
    "axs[1,0].imshow(x[0][-1], cmap='coolwarm')\n",
    "axs[0,1].imshow(x_hat[0][0], cmap='coolwarm')\n",
    "axs[1,1].imshow(x_hat[0][-1], cmap='coolwarm')\n",
    "\n",
    "n = x.shape[-1]\n",
    "\n",
    "_,y,z,d = y[0]\n",
    "axs[0,0].plot(z*n-.5, y*n-.5, 'go', ms = 6, mfc = 'g')\n",
    "c1 = plt.Circle((z*n-.5, y*n-.5), d*n/2, color='g', fill=False, lw=2)\n",
    "axs[0,0].add_patch(c1)\n",
    "\n",
    "_,y,z,d = y_hat[0]\n",
    "axs[0,1].plot(z*n-.5, y*n-.5, 'yo', ms = 6, mfc = 'y')\n",
    "c2 = plt.Circle((z*n-.5, y*n-.5), d*n/2, color='y', fill=False, lw=2)\n",
    "axs[0,1].add_patch(c2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 319
    },
    "id": "eNAP7_tEDhlx",
    "outputId": "adeaf4da-023a-4dcd-da54-0ba48a136e60"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.image.AxesImage at 0x22ca2287490>"
      ]
     },
     "execution_count": 348,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 720x360 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "_, axs = plt.subplots(1,2, figsize=(10,5))\n",
    "axs[0].imshow(l[0][0], cmap='coolwarm')\n",
    "axs[1].imshow(l[0][1], cmap='coolwarm')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "FPJNUBu17-4P"
   },
   "outputs": [],
   "source": [
    "convnet_orig = torch.load('./models/convnet32_2.model')\n",
    "convnet_orig2 = torch.load('./models/convnet32_3.model')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "-5e1gAxN4_eJ",
    "outputId": "daff3aad-40ed-489f-eaa6-9c11cdc06e72"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.03505374367751805"
      ]
     },
     "execution_count": 377,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "predictor = nn.Sequential(\n",
    "    model.encoder,\n",
    "    convnet_orig2\n",
    ")\n",
    "ev = utils.Evaluator(predictor, dataset=test_loader32.dataset.data)\n",
    "ev.calculate_loss()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "AjHuM4mZ5OS0",
    "outputId": "0d577fdc-d5e5-4807-a6b7-0894669f4091"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.004869489739309137"
      ]
     },
     "execution_count": 378,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_ev = utils.Evaluator(predictor, dataset=test_data)\n",
    "test_ev.calculate_loss()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 462
    },
    "id": "UiXazQftLHm3",
    "outputId": "85396fdd-46e4-43ac-fd24-c89a36d82cc2"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "true: [0.265625 0.234375 0.6875   0.0625  ]\n",
      "prediction: [0.20891773 0.21039688 0.73694876 0.07210455]\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 864x504 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "test_ev.plot_next()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "9r9zRfrzEtWd",
    "outputId": "7c7c5001-e718-44e1-9be9-37153b2cd428"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.0013476770674266377"
      ]
     },
     "execution_count": 194,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "predictor2 = nn.Sequential(\n",
    "    model.encoder,\n",
    "    model.regressor\n",
    ")\n",
    "ev = utils.Evaluator(predictor2, dataset=test_loader32.dataset.data)\n",
    "ev.calculate_loss()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "Xc6Ohr4KEzvy",
    "outputId": "fd0fa57c-ea3a-44b8-a5c2-a0c32e58e8c3"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.07625786034401716"
      ]
     },
     "execution_count": 195,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_ev = utils.Evaluator(predictor2, dataset=test_data)\n",
    "test_ev.calculate_loss()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "6pUIrBRRm9h2",
    "outputId": "8df4c4bc-e610-472c-bc47-29108ca675b9"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.02325101620671195"
      ]
     },
     "execution_count": 262,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_predictor = nn.Sequential(\n",
    "    nn.AvgPool2d(kernel_size=2, stride=2),\n",
    "    convnet_orig2\n",
    ")\n",
    "\n",
    "test_ev2 = utils.Evaluator(test_predictor, dataset=test_data)\n",
    "test_ev2.calculate_loss()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "kjKC1XD8EpSP"
   },
   "outputs": [],
   "source": [
    "loader_iter32 = iter(test_loader32)\n",
    "loader_iter64 = iter(test_loader)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 308
    },
    "id": "QFqKCDiO7wtp",
    "outputId": "4cbfe425-257d-494b-d08e-2dbf1c6c9d1f"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.image.AxesImage at 0x22ca6c05fd0>"
      ]
     },
     "execution_count": 359,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 1440x360 with 4 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "downsample = nn.AvgPool2d(kernel_size=2, stride=2)\n",
    "\n",
    "x,y = next(loader_iter32)\n",
    "\n",
    "with torch.no_grad():\n",
    "    x_hat = model.encoder.blocks[0](x)\n",
    "    down = downsample(x)\n",
    "    res = x_hat-down\n",
    "    \n",
    "_, axs = plt.subplots(1,4, figsize=(20,5))\n",
    "axs[0].imshow(x[0][0], cmap='coolwarm')\n",
    "axs[1].imshow(x_hat[0][0], cmap='coolwarm')\n",
    "axs[2].imshow(down[0][0], cmap='coolwarm')\n",
    "axs[3].imshow(res[0][0], cmap='coolwarm')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "RFA_hReNEp_F",
    "outputId": "3195d3da-5d30-4e95-c874-15d2f32f20f1"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(tensor([0.5026, 0.5008, 0.4970, 0.4919, 0.4843, 0.4746, 0.4621, 0.4476, 0.4314,\n",
       "         0.4155, 0.4016, 0.3940, 0.3884, 0.3851, 0.3839, 0.3834],\n",
       "        dtype=torch.float64),\n",
       " tensor([0.4528, 0.4524, 0.4510, 0.4491, 0.4458, 0.4414, 0.4351, 0.4278, 0.4190,\n",
       "         0.4103, 0.4019, 0.3954, 0.3907, 0.3879, 0.3869, 0.3864],\n",
       "        dtype=torch.float64),\n",
       " tensor([ 0.0499,  0.0484,  0.0460,  0.0428,  0.0385,  0.0332,  0.0270,  0.0199,\n",
       "          0.0123,  0.0052, -0.0003, -0.0015, -0.0023, -0.0028, -0.0030, -0.0030],\n",
       "        dtype=torch.float64))"
      ]
     },
     "execution_count": 268,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x_hat[0][0][-1],down[0][0][-1],res[0][0][-1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 310
    },
    "id": "583za-izFLb-",
    "outputId": "0b9cedf8-479b-47d1-aa91-ef38b65529db"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.image.AxesImage at 0x22caacdaa90>"
      ]
     },
     "execution_count": 371,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 1440x360 with 4 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "downsample = nn.AvgPool2d(kernel_size=2, stride=2)\n",
    "\n",
    "x,y = next(loader_iter64)\n",
    "\n",
    "with torch.no_grad():\n",
    "    x_hat = model.encoder.blocks[0](x)\n",
    "    down = downsample(x)\n",
    "    res = x_hat-down\n",
    "    \n",
    "_, axs = plt.subplots(1,4, figsize=(20,5))\n",
    "axs[0].imshow(x[0][0], cmap='coolwarm')\n",
    "axs[1].imshow(x_hat[0][0], cmap='coolwarm')\n",
    "axs[2].imshow(down[0][0], cmap='coolwarm')\n",
    "axs[3].imshow(res[0][0], cmap='coolwarm')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "7T0iz16JpEug",
    "outputId": "5de1553b-a212-45fd-8e93-7268e0870091"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(tensor([ 0.4311,  0.4274,  0.4181,  0.4036,  0.3814,  0.3492,  0.3029,  0.2396,\n",
       "          0.1594,  0.0517, -0.0912, -0.2687, -0.4775, -0.7054, -0.9193, -1.0755,\n",
       "         -1.1330, -1.0738, -0.9157, -0.7010, -0.4729, -0.2639, -0.0885,  0.0509,\n",
       "          0.1587,  0.2387,  0.3034,  0.3490,  0.3799,  0.4005,  0.4129,  0.4171],\n",
       "        dtype=torch.float64),\n",
       " tensor([ 0.3917,  0.3893,  0.3823,  0.3713,  0.3543,  0.3290,  0.2916,  0.2378,\n",
       "          0.1620,  0.0579, -0.0808, -0.2567, -0.4666, -0.6951, -0.9090, -1.0654,\n",
       "         -1.1235, -1.0654, -0.9090, -0.6951, -0.4666, -0.2567, -0.0808,  0.0576,\n",
       "          0.1617,  0.2372,  0.2907,  0.3278,  0.3528,  0.3692,  0.3789,  0.3826],\n",
       "        dtype=torch.float64),\n",
       " tensor([ 0.0394,  0.0382,  0.0358,  0.0323,  0.0271,  0.0201,  0.0113,  0.0018,\n",
       "         -0.0026, -0.0063, -0.0104, -0.0120, -0.0109, -0.0103, -0.0103, -0.0101,\n",
       "         -0.0095, -0.0084, -0.0067, -0.0059, -0.0063, -0.0073, -0.0077, -0.0067,\n",
       "         -0.0030,  0.0015,  0.0127,  0.0212,  0.0272,  0.0313,  0.0339,  0.0345],\n",
       "        dtype=torch.float64))"
      ]
     },
     "execution_count": 372,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x_hat[0][0][-1],down[0][0][-1],res[0][0][-1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "nKmVUE5vpJJY"
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "colab": {
   "provenance": []
  },
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
